home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_13_11
/
phillip2
/
display.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-04
|
18KB
|
624 lines
/**************************************************
*
* file d:\cips\display.c
*
* Functions: This file contains
* display_image
* display_image_portion
* display_menu_for_display_image
* map_16_shades_of_gray
* my_map_64_shades_of_gray
* transform_the_colors
*
* Purpose:
* These functions display images on a the
* monitor.
*
* NOTE: This file is full of Microsoft
* specific code. The PC C compiler
* makers all have their own routines
* for making dots appear on the
* screen. I put the statement
* MSC 6.0 next to these calls.
*
*
* External Calls:
* rtiff.c - read_tiff_image
* cips.c - my_clear_text_screen
* hist.c - zero_histogram
* calculate_histogram
* perform_histogram_equalization
* display_histogram
*
* Modifications:
* 17 June 1987 - created
* August 1990 - extension modifications for use
* in the C Image Processing System.
*
***************************************************/
#include "cips.h"
/***************************
*
* display_image(...
*
****************************/
display_image(file_name, image, il, ie, ll, le,
image_header, monitor_type,
color_transform, invert, image_colors,
display_colors, show_hist, title)
char color_transform[],
file_name[],
monitor_type[],
title[];
int display_colors,
image_colors,
invert,
il,
ie,
ll,
le,
show_hist;
short image[ROWS][COLS];
struct tiff_header_struct *image_header;
{
char channels[80],
response[80];
int a,
b,
c,
channel,
count,
display_mode,
dx_offset,
dy_offset,
key,
horizontal,
len,
max_horizontal,
max_vertical,
not_finished,
q,
r,
vertical,
x_offset,
y_offset;
unsigned int block,
color,
i,
j,
x,
y;
unsigned long histogram[256], new_hist[256];
/**********************************************
*
* If you want to display the histogram and
* do not want to perform hist equalization,
* then zero the histogram for calculations.
*
**********************************************/
if( (show_hist == 1) &&
(color_transform[0] != 'H'))
zero_histogram(histogram);
not_finished = 1;
while(not_finished){
if(display_colors == 16){
if(monitor_type[0] == 'V'){
horizontal = 4;
vertical = 6;
display_mode = VRES16COLOR; /* MSC 6.0 */
} /* ends if V */
if(monitor_type[0] == 'E'){
horizontal = 3;
vertical = 6;
display_mode = ERESCOLOR; /* MSC 6.0 */
} /* ends if E */
} /* ends if colors == 16 */
else{
horizontal = 2;
vertical = 2;
display_mode = MAXCOLORMODE; /* MSC 6.0 */
}
/********************************************
*
* Somehow, my dx and dy offsets are
* backwards from my horizontal and vertical
* variables. Trying to center the images
* on the screen. March 21 1992
*
********************************************/
max_horizontal = (image_header->image_length+50)
/COLS;
max_vertical = (image_header->image_width+50)
/ROWS;
dy_offset = ((horizontal-max_horizontal)/2)
*COLS + 50;
dx_offset = ((vertical-max_vertical)/2)
*ROWS + 20;
if(max_horizontal > horizontal) dy_offset = 0;
if(max_vertical > vertical) dx_offset = 0;
if(horizontal > max_horizontal)
horizontal = max_horizontal;
if(vertical > max_vertical)
vertical = max_vertical;
/****************************************
*
* If color transform wants histogram
* equalization, then read in the
* image arrays and calculate the
* histogram. Zero both the histogram
* and the new_hist. You will need the
* new_hist if you want to display the
* equalized hist.
*
*****************************************/
if(color_transform[0] == 'H'){
count = 1;
zero_histogram(histogram);
zero_histogram(new_hist);
for(a=0; a<vertical; a++){
for(b=0; b<horizontal; b++){
x = a*COLS;
y = b*ROWS;
printf(
"\nDISPLAY> Calculating histogram");
printf(" %d of %d",
count,vertical*horizontal);
count++;
read_tiff_image(file_name, image, il+y,
ie+x, ll+y, le+x);
calculate_histogram(image, histogram);
} /* ends loop over b */
} /* ends loop over a */
} /* ends if display_mode == H */
/* set graphics mode */
my_setvideomode(display_mode); /* MSC 6.0 */
if(display_colors == 16)
map_16_shades_of_gray(display_mode);
if(display_colors == 256)
my_map_64_shades_of_gray();
/****************************************
*
* Loop over this size and
* read and display ROWSxCOLS arrays.
*
* If you want to show the histogram AND
* do not want to do hist equalization
* then calculate the hist from the
* original image array.
*
* If you want to do hist equalization
* then calculate the new_hist AFTER
* the image has been equalized by the
* the transform_the_colors function.
*
* NOTE: Remember that the function
* transform_the_colors changes the
* gray shade values in image array.
*
*****************************************/
/*****************************************
*
* These statements place a gray
* background across the display area of
* a VGA screen. This reduces the
* contrast between the screen background
* and the images you display. This makes
* it easier to take photos.
*
*******************************************/
/* MSC 6.0 */
my_setlinestyle(0xFFFF);
my_setcolor(10);
for(i=0; i<640;i++){
my_moveto(i, 0);
my_lineto(i, 480);
}
for(a=0; a<vertical; a++){
for(b=0; b<horizontal; b++){
x = a*COLS;
y = b*ROWS;
read_tiff_image(file_name, image, il+y,
ie+x, ll+y, le+x);
if( (show_hist == 1) &&
(color_transform[0] != 'H'))
calculate_histogram(image, histogram);
transform_the_colors(image,
color_transform,
display_colors,
image_colors,
histogram,
horizontal,
vertical);
if(color_transform[0] == 'H')
calculate_histogram(image, new_hist);
display_image_portion(image, x+dx_offset,
y+dy_offset,
display_colors,
imag